Add Event#location.

Akinori MUSHA 10 年之前
父节点
当前提交
d4bd3c7c8b
共有 2 个文件被更改,包括 82 次插入0 次删除
  1. 32 0
      app/models/event.rb
  2. 50 0
      spec/models/event_spec.rb

+ 32 - 0
app/models/event.rb

@@ -32,6 +32,38 @@ class Event < ActiveRecord::Base
32 32
     where.not(lat: nil).where.not(lng: nil)
33 33
   }
34 34
 
35
+  def location
36
+    @location ||= {
37
+      # lat and lng are BigDecimal, so convert them to Float
38
+      lat: (lat.to_f if lat),
39
+      lng: (lng.to_f if lng),
40
+      radius:
41
+        begin
42
+          h = payload[:horizontal_accuracy].presence
43
+          v = payload[:vertical_accuracy].presence
44
+          if h && v
45
+            (h.to_f + v.to_f) / 2
46
+          else
47
+            (h || v || payload[:accuracy]).to_f
48
+          end
49
+        end,
50
+      course:
51
+        begin
52
+          if (v = payload[:course].presence) &&
53
+             (v = v.to_f) >= 0
54
+            v
55
+          end
56
+        end,
57
+      speed:
58
+        begin
59
+          if (v = payload[:speed].presence) &&
60
+             (v = v.to_f) >= 0
61
+            v
62
+          end
63
+        end,
64
+    }
65
+  end
66
+
35 67
   # Emit this event again, as a new Event.
36 68
   def reemit!
37 69
     agent.create_event :payload => payload, :lat => lat, :lng => lng

+ 50 - 0
spec/models/event_spec.rb

@@ -15,6 +15,56 @@ describe Event do
15 15
     end
16 16
   end
17 17
 
18
+  describe "#location" do
19
+    it "returns a default hash when an event does not have a location" do
20
+      event = events(:bob_website_agent_event)
21
+      event.location.should == {
22
+        lat: nil,
23
+        lng: nil,
24
+        radius: 0.0,
25
+        speed: nil,
26
+        course: nil,
27
+      }
28
+    end
29
+
30
+    it "returns a hash containing location information" do
31
+      event = events(:bob_website_agent_event)
32
+      event.lat = 2
33
+      event.lng = 3
34
+      event.payload = {
35
+        radius: 300,
36
+        speed: 0.5,
37
+        course: 90.0,
38
+      }
39
+      event.save!
40
+      event.location.should == {
41
+        lat: 2.0,
42
+        lng: 3.0,
43
+        radius: 0.0,
44
+        speed: 0.5,
45
+        course: 90.0,
46
+      }
47
+    end
48
+
49
+    it "ignores invalid speed and course" do
50
+      event = events(:bob_website_agent_event)
51
+      event.lat = 2
52
+      event.lng = 3
53
+      event.payload = {
54
+        speed: -1,
55
+        course: -1,
56
+      }
57
+      event.save!
58
+      event.location.should == {
59
+        lat: 2.0,
60
+        lng: 3.0,
61
+        radius: 0.0,
62
+        speed: nil,
63
+        course: nil,
64
+      }
65
+    end
66
+  end
67
+
18 68
   describe "#reemit" do
19 69
     it "creates a new event identical to itself" do
20 70
       events(:bob_website_agent_event).lat = 2